package com.example.service;

import com.example.model.DTO.InsuranceAccountDTO;
import com.example.model.DTO.MaskedUserDTO;
import com.example.model.DTO.UpdatePhoneDTO;
import com.example.model.DTO.UserDTO;
import com.example.model.Result;
import com.example.model.UserProfile;
import com.example.model.pojo.Apply;
import com.example.model.pojo.CaculateRetirement;
import com.example.model.pojo.InsuranceAccount;
import com.example.model.pojo.Person;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户服务接口
 * 提供用户注册、登录、社保管理等功能
 *
 * @author zhexueqi
 * @since 2024/4/11
 */
public interface UserService {

    /**
     * 封禁用户账户
     */
    Result<String> banUser(Long userId, LocalDateTime expiryTime, Integer banType);

    /**
     * 解封用户账户
     */
    Result<String> unbanUser(Long userId,Integer banType);

    /**
     * 用户登录
     *
     * @param userDTO 用户登录信息，包含用户地址、名称、签名和类型
     * @param request HTTP请求对象
     * @return 登录结果，包含用户信息
     */
    Result<Object> login(UserDTO userDTO, HttpServletRequest request);

    /**
     * 注册员工账户
     * 将已注册的个人用户添加为企业员工，建立社保关系
     *
     * @param insuranceAccountDTO 员工社保账户信息
     * @return 注册结果，包含签名信息
     */
    Result<String> addEmployee(InsuranceAccountDTO insuranceAccountDTO);

    /**
     * 注册个人用户
     * 创建区块链账户并存储用户基本信息
     *
     * @param person 个人用户信息，包含姓名、身份证、年龄等基本信息
     * @return 注册结果，包含区块链地址和签名信息
     */
    Result<String> addPerson(Person person);

    /**
     * 申请社保转移
     * 处理用户在不同地区间的社保关系转移
     *
     * @param apply 转移申请信息，包含申请人和目标地区信息
     * @return 申请结果
     */
    Result<String> applyForTransfer(Apply apply);

    /**
     * 缴纳养老保险
     * 处理企业和个人的社保缴费
     *
     * @param insuranceAccount 缴费账户信息
     * @return 缴费结果
     */
    Result<String> makePayment(InsuranceAccount insuranceAccount);

    /**
     * 计算退休金
     * 根据用户信息和参数计算预期退休金
     *
     * @param calculateRetirementBo 计算参数，包含用户地址、退休年龄和平均工资等
     * @return 预计退休金金额
     */
    Result<Double> calculateRetirementPension(CaculateRetirement calculateRetirementBo);

    /**
     * 获取当前登录用户的脱敏信息
     * 对敏感信息如身份证号、联系电话、电子邮箱和钱包地址进行脱敏处理
     * 
     * @return 脱敏后的用户信息
     */
    Result<MaskedUserDTO> getCurrentUserMaskedInfo();

    /**
     * 更新用户头像
     * 上传头像到阿里云OSS并更新用户头像URL
     *
     * @param file 头像文件
     * @return 更新结果，包含头像URL
     */
    Result<String> updateAvatar(MultipartFile file);

    /**
     * 修改用户手机号
     * 验证并更新当前登录用户的手机号
     *
     * @param updatePhoneDTO 包含新手机号和验证信息的DTO
     * @return 更新结果
     */
    Result<String> updatePhone(UpdatePhoneDTO updatePhoneDTO);

    Result<String> verifyOldPhone(String oldPhone);

    Result<String> updatePhone(String newPhone);

    /**
     * 获得用户资料
     */
    UserProfile getProfile(String userAddress);

    /**
     * 获取最近活跃用户列表
     * 查询最近一段时间内有登录或操作记录的用户地址
     * 
     * @return 活跃用户地址列表
     */
    List<String> getActiveUsers();

    boolean requireReVerification(String userAddress);

    /**
     * 将用户标记为有风险
     * 更新用户的风险等级
     *
     * @param userAddress 用户地址
     * @return 是否成功标记
     */
    boolean markAsRisky(String userAddress);

    /**
     * 限制用户敏感操作
     * 对风险用户进行操作限制
     *
     * @param userAddress 用户地址
     * @return 是否成功限制
     */
    boolean limitSensitiveOperations(String userAddress);

    /**
     * 更新用户风险等级
     *
     * @param userAddress 用户地址
     * @param riskLevel   风险等级 0-低风险 1-中风险 2-高风险
     * @return 是否成功更新
     */
    boolean updateUserRiskLevel(String userAddress, Integer riskLevel);
}
